import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description: 练习题
 * User: 阿宾
 * Date: 2024-05-04
 * Time: 21:37
 */
public class Test04 {


    public static int max2(int x,int y){
        return x > y ? x : y;
    }
    public static int max3(int x,int y,int z){
        if(max2(x,y) >= z){
            return max2(x,y);
        }else{
            return z;
        }
    }
    public static void main1(String[] args) {
        /*
        创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
        要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算
         */
        int x = 10;
        int y = 200;
        int z = 5;
        System.out.println(max3(x, y, z));
    }

    //求 N 的阶乘
    public static int fac(int n){
        if(n == 1){
            return 1;
        }
        return n * fac(n-1);
    }
    /*public static void main2(String[] args) {
        int n = 5;
        System.out.println(fac(n));
    }*/

    //求1！+2！+3！+4！+........+n!的和
    public static int fac1(int n){
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += fac(i);
        }
        return sum;
    }

    public static void main2(String[] args) {
        System.out.println(fac1(3));
    }

    //求斐波那契数列的第n项。(迭代实现)
    public static int fac2(int n) {
        //0 1 1 2 3 5...
        if(n == 1){
            return 0;
        }
        if(n == 2){
            return 1;
        }
        int n1 = 0;
        int n2 = 1;
        int n3 = 0;
        while(n > 2){
            n3 = n1 + n2;
            n1 = n2;
            n2 = n3;
            n--;
        }
        return n3;
    }
    public static void main3(String[] args) {
        System.out.println(fac2(6));
    }

    //在同一个类中定义多个方法：要求不仅可以求2个整数的最大值，还可以求3个小数的最大值？
    public static int max(int x,int y){
        return x>y?x:y;
    }
    public  static int max(int x,int y,int z){
        return max(x,y) > z ? max(x,y) : z;
    }
    public static void main4(String[] args) {
        int x = 20;
        int y = 30;
        int z = 100;
        System.out.println(max(x, y));
        System.out.println(max(x, y, z));
    }
    //在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码，求出结果
    public static int sum(int x,int y){
        return x + y;
    }
    public static double sum(double x,double y,double z){
        return x + y + z;
    }
    public static void main5(String[] args) {
        int x = 2;
        int y = 3;
        int z = 4;
        System.out.println(sum(y, z));
        System.out.println(sum(x, y, z));
    }
    //递归求 N 的阶乘
    public static int fun(int n){
        if(n == 1){
            return 1;
        }
        return n * fun(n - 1);
    }
    public static void main6(String[] args) {
        System.out.println(fun(6));
    }
    //递归求解汉诺塔问题
    public static void move(char pos1,char pos2){
        System.out.println(pos1 + "移动到" + pos2);
    }
    public static void hanoi(int n,char c1,char c2,char c3){
        /*
        有3根柱子，A，B，C；A柱上放N个盘子，上面小，下面大
        问题：
        把A柱上所有盘子挪到C柱上（可以借助B柱）
        过程中：所有柱子上的盘子，也要下面大，上面小，且一次只能移动一个盘子。
         */
        if(n == 1){
            move(c1,c3);
            return;
        }
        hanoi(n-1,c1,c3,c2);
        move(c1,c3);
        hanoi(n-1,c2,c1,c3);



    }
    public static void main7(String[] args) {
        char c1 = 'A';
        char c2 = 'B';
        char c3 = 'C';
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        hanoi(n,c1,c2,c3);
    }

}
